//
//  ECGStressTemp.m
//  CPETEcgModule
//
//  Created by moon_zm on 2024/3/20.
//


#import "ECGStressTemp.h"
#import <vhStressTemplLib/vhStressTemplLib-Swift.h>
#import "ECGFiltersLib.h"
@interface ECGStressTemp ()
@property (nonatomic, strong) vhMeanRRmsLib *vhMeanRRmsLib;//ST分析心率核心对象
@property (nonatomic, strong) vhStressTemplLib *vhStressTemplLib;//ST分析核心对象

@end

@implementation ECGStressTemp

+ (instancetype)shared {
    static ECGStressTemp *identifier = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        identifier = [[ECGStressTemp alloc] init];
    });
    return identifier;;
}

- (instancetype)init {
    if (self = [super init]) {
        //创建ST分析器
        self.vhStressTemplLib = [[vhStressTemplLib alloc] init];
    }
    return self;
}

//初始化创建st分析核心对象是否成功, warn：先有心电数据才可创建st分析
- (void)initWithECGUVpb:(double)uVpb {
    BOOL ok = [self.vhStressTemplLib createWithMe:@"hspecg@163.com" fs:ECGFiltersLib.shared.ecgRate chn:12 uVpb:uVpb mutex_lock:YES];
    if(!ok){
        NSLog(@"create ST error");
    }
    self.vhMeanRRmsLib = [[vhMeanRRmsLib alloc] initWithFs:ECGFiltersLib.shared.ecgRate chn:12 freqNotch:ECGFiltersLib.shared.freq_notch uVpb:uVpb];
}

/// Clear buffer
- (void)destroy {
    [self.vhStressTemplLib destroy];
}
/**return 新的12导联心电模版
 * templ：12导联的，静息心电图分析
 * posQ: 样本中QRS起始点
 * posJ: 样本中QRS偏移量，J点
 * postJms: J点后的ms
 */
- (NSArray<NSArray<NSNumber *> *> * _Nullable)restTemplWithTempl:(NSArray<NSArray<NSNumber *> *> * _Nonnull)templ posQ:(int16_t)posQ posJ:(int16_t)posJ postJms:(int16_t)postJms {
    return [self.vhStressTemplLib restTemplWithTempl:templ posQ:posQ posJ:posJ postJms:postJms];
}
/** return：获取posZ(Zero voltage point), posJ, postJms
 posZ：零电压点
 posJ：偏移量J点
 postJms：J点后ms
 样本中posZ，posJ，postJms 可能为空
 */
- (NSArray<NSNumber *> * _Nullable)getPos {
    return [self.vhStressTemplLib getPos];
}
/**return：为每组抽样数据匹配模版
 * data：a group 12-lead sampling data
 */
- (NSArray<NSArray<NSNumber *> *> * _Nullable)matchWithData:(NSArray<NSNumber *> * _Nonnull)data {
    return [self.vhStressTemplLib matchWithData:data];
}
/**获取新的12导联模版
 */
- (NSArray<NSArray<NSNumber *> *> * _Nullable)getTempl {
    return [self.vhStressTemplLib getTempl];
}
/** Set new posZ,posJ
 */
- (void)setPosWithPosZ:(int16_t)posZ posJ:(int16_t)posJ {
    [self.vhStressTemplLib setPosWithPosZ:posZ posJ:posJ];
}
/**Set new postJms
 */
- (void)setPostJmsWithPostJms:(int16_t)postJms {
    [self.vhStressTemplLib setPostJmsWithPostJms:postJms];
}
/** 获取12导联ST段段斜率slope，单位mV/s
 */
- (NSArray<NSNumber *> * _Nullable)getSTslope {
    return [self.vhStressTemplLib getSTslope];
}
/** 获取12导联 ST段的值，单位uV
 */
- (NSArray<NSNumber *> * _Nullable)getSTuv {
    return [self.vhStressTemplLib getSTuv];
}

- (int16_t)meanRRmsWithData:(NSArray<NSNumber *> * _Nonnull)data {
    return [self.vhMeanRRmsLib meanRRmsWithData:data];
}

- (int16_t)meanHRWithData:(NSArray<NSNumber *> * _Nonnull)data {
    return [self.vhMeanRRmsLib meanHRWithData:data];
}

/**采样时计算心率，返回一个合适的心率
 *data1：12导联中，1导联的采样数据
 *data2：12导联中，2导联的采样数据
 *data3：12导联中，3导联的采样数据
 */
- (int16_t)getMeanHRWithData1:(int16_t)data1 data2:(int16_t)data2 data3:(int16_t)data3 {
    return [self.vhStressTemplLib getMeanHRWithData1:data1 data2:data2 data3:data3];
}
/**获取杜克比分（Duke score）
 * seconds：运动持续时间
 * deepestSTwithmV：ST的低压
 * anginaPectoris：心绞痛值（0：无，1：无限制，2：有限制）
 */
+ (int16_t)getDukeWithStressSeconds:(int16_t)seconds deepestSTwithmV:(float)mV anginaPectoris:(int16_t)index {
    return [vhStressTemplLib getDukeWithStressSeconds:seconds deepestSTwithmV:mV anginaPectoris:index];
}
/** 获取PWC130/150/170，数组中有三个元素，如果无效时元素为-1
 * power：运动阶段，功率值（W）
 * hr：bpm中与功率有关的心率数组
 */
+ (NSArray<NSNumber *> * _Nullable)getPWCWithPower:(NSArray<NSNumber *> * _Nonnull)power andHR:(NSArray<NSNumber *> * _Nonnull)hr {
    return [vhStressTemplLib getPWCWithPower:power andHR:hr];
}

@end
